package entidades;

import util.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.HashMap;
import java.util.LinkedList;
import com.google.gson.Gson;

/**
 * @author JFM
 */
public class TipoPapel extends Entidad
	{
	private String descripcion;
	private boolean activo;

	static final String NOMBRE_TABLA = "tipos_papel";


	// --- Constructores --- //

	public TipoPapel()
		{
		super();
		this.descripcion = "";
		this.activo = true;
		}

	public TipoPapel(int id) throws SQLException
		{ super(id); }

	public TipoPapel(String id) throws SQLException
		{ super(id); }

	public TipoPapel(ResultSet result) throws SQLException
		{ super(result); }

	public TipoPapel(ResultSet result, String prefix) throws SQLException
		{ super(result, prefix); }


	// --- Metodos get()/set() --- //

	public String getDescripcion()
		{ return descripcion; }
	public void setDescripcion(String descripcion)
		{ this.descripcion = (descripcion != null)? descripcion : ""; }

	public boolean isActivo()
		{ return activo; }
	public void setActivo(boolean activo)
		{ this.activo = activo; }
	public void setActivo(String activo)
		{ this.activo = activo != null && ( activo.compareTo("1") == 0 || activo.compareTo("true") == 0); }

	@Override
	public String getDescriptor()
		{ return descripcion; }

	@Override
	public String toJson()
		{
		HashMap map = new HashMap();
		map.put("id", id);
		map.put("descripcion", descripcion);
		map.put("activo", activo);
		return new Gson().toJson(map);
		}

	@Override
	public String toString()
		{ return descripcion; }

	@Override
	public String getNombreTabla()
		{ return NOMBRE_TABLA; }

	// --- Metodos MySQL --- //

	@Override
	public void leer(ResultSet result, String prefijo) throws SQLException
		{
		this.setId(result.getInt(prefijo + "id"));
		this.setDescripcion(result.getString(prefijo + "descripcion"));	
		this.setActivo(result.getBoolean(prefijo + "activo"));
		}

	public static List<TipoPapel> listar() throws SQLException
		{ return listar(false); }

	public static List<TipoPapel> listar(boolean soloActivos) throws SQLException
		{
		String where = (soloActivos)? "activo = 1" : "";
		return (List) EntidadSimple.buscar(TipoPapel.class, NOMBRE_TABLA, where, "descripcion ASC");
		}

	public static List<TipoPapel> listar(int lineaId) throws SQLException
		{ return listar(lineaId, false); }

	public static List<TipoPapel> listar(int lineaId, boolean soloActivos) throws SQLException
		{
		String where ="EXISTS (SELECT * FROM tipos_papel_x_lineas pxl WHERE "+NOMBRE_TABLA+".id = pxl.tipo_papel_id AND pxl.linea_id = "+lineaId + ")";
		if(soloActivos) where += " AND activo = 1";
		return (List) EntidadSimple.buscar(TipoPapel.class, NOMBRE_TABLA, where, "descripcion ASC");
		}

	@Override
	public void guardar() throws SQLException
		{
		ResultSet result = MySQL.executeQuery("Call TiposPapel_Save(" +
				MySQL.formatId(id) + "," +
				MySQL.format(descripcion) + "," +
				MySQL.formatBit(activo) + ")");

		if(result.next())
			{
			if( result.getMetaData().getColumnCount() == 1)
				{
				String msj = result.getString("mensaje");
				throw new SQLException(msj);
				}
			else
				{ this.leer(result); }
			}

		result.getStatement().close();
		}

	public static void borrar(String id) throws SQLException
		{ MySQL.executeUpdate("Call TiposPapel_Delete("+id+")"); }

	public void asignarLinea(String lineaId) throws SQLException
		{ asignarLinea(this.id, Integer.parseInt(lineaId)); }

	public static void asignarLinea(int tipoPapelId, int lineaId) throws SQLException
		{ MySQL.executeUpdate("CALL TiposPapel_AsignarLinea("+tipoPapelId+", "+lineaId+")"); }

	public void borrarLineas() throws SQLException
		{ MySQL.executeUpdate("DELETE FROM tipos_papel_x_lineas WHERE tipo_papel_id = " + this.id); }

	public List<Integer> getLineasId() throws SQLException
		{
		LinkedList<Integer> lista = new LinkedList();
        ResultSet result = MySQL.executeQuery("SELECT linea_id FROM tipos_papel_x_lineas WHERE tipo_papel_id = "+id);

		while(result.next())
			{
			Integer estado = new Integer( result.getInt("linea_id") );
			lista.add(estado);
			}

		result.getStatement().close();
		return lista;
		}

	/**
	 * Devuelve el id del tipo de papel de 'tipoPapel'.
	 * Si dicho tipo de papel no existe, lo crea y lo inserta en la base de datos.
	 * 
	 * @param tipoPapel El nombre del tipo de papel.
	 * @return El id del tipo de papel.
	 * @throws SQLException 
	 */
	public static int getId(String tipoPapel) throws SQLException
		{
		int id = 0;
		
		ResultSet res = MySQL.executeQuery("SELECT id FROM " + NOMBRE_TABLA + " WHERE LOWER(descripcion) = " + MySQL.format(tipoPapel.toLowerCase()));
		if(res.next())
			{
			id = res.getInt("id");
			res.getStatement().close();
			}
		else
			{
			res.getStatement().close();
			TipoPapel tipo = new TipoPapel();
			tipo.setDescripcion(tipoPapel);
			tipo.guardar();
			id = tipo.getId();
			}
		
		return id;
		}	
	}
